/**
 * 购物车的Store模块
 */

export default {
  namespaced: true,

  state: () => ({
    // 购物车的数组，用来存储购物车中每个商品的信息对象
    // 每个商品的信息对象，都包含如下 6 个属性：
    // { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
    cart: JSON.parse(uni.getStorageSync('cart') || '[]') //购物车数组=>3.将本地数据取出来,进行赋值
  }),
  mutations: {
    // 需要修改cart数据,所以定义一个方法
    // 加入购物车=>goods-detail里传入商品,加入cart中
    addToCart(state, goods) {
      // 判断cart中是否存在同名的商品=>用cart数组可传过来的goods数组的id做对比
      const findResult = state.cart.find(item => item.goods_id === goods.goods_id)
      // console.log(findResult)  找到的该商品的数组
      // 如果存在,只需要让购买数量+1
      // 如果不存在,需要将商品push到cart中即可
      if (findResult) {
        // 为true找到了,存在
        findResult.goods_count += 1
      } else {
        // 不存在
        state.cart.push(goods)
      }

      // 2.调用存储本地方法=.数据立马发生改变,就把数据存到本地
      this.commit('m_cart/saveToStorage')
    },

    // 1. 将购物车数据存储到本地
    saveToStorage(state) {
      uni.setStorageSync('cart', JSON.stringify(state.cart))
    },
    
    // 更改购买商品的状态
    updateGoodsState(state,goods){
      const findResult=state.cart.find(item=>item.goods_id===goods.goods_id)
      
      if(findResult){
        // 存在就把传过来的按钮状态更新
        findResult.goods_state=goods.goods_state
      }
      
      // 并把状态本地持久化
      this.commit('m_cart/saveToStorage')
    },
    
    // 更改购买商品的数量
    updateGoodsCount(state,goods){
      const findResult=state.cart.find(item=>item.goods_id===goods.goods_id)
      
      if(findResult){
        findResult.goods_count=goods.goods_count
      }
      
      this.commit('m_cart/saveToStorage')
    },
    
    // 改成所有商品的状态
    updateAllGoodsState(state,newState){
      // 遍历所有的小按钮,把传过来的全选按钮的状态赋值给所有的小按钮
      state.cart.forEach(item=>item.goods_state=newState)
    }
  },
  getters: {
    // 动态计算需要购买的商品总数量
    total(state) {
      // 累加器,用来动态计算商品总和
      let allCount = 0

      state.cart.forEach(item => allCount += item.goods_count)
      // 将累加后商品的总和返回
      return allCount
    },
    // 结算数量的实现
    checkedCount(state){
      // filter 方法筛选出需要购买的商品数组=>根据单选按钮的状态
      // reduce 实现购买数量的累加
      
      // reduce 可以用来做运算
      // 第一个参数:是一个回调函数,用来执行逻辑
      //    函数的第一个参数:是累加器返回的值,可以理解为是累加器
      //    函数的第二个参数:数组中正在处理的元素
      // 第二个参数:是一个初始值
      return state.cart.filter(item=>item.goods_state).reduce((total,item)=>total+=item.goods_count,0)
    },
    
    // 动态计算已经勾选的商品总价
    checkedGoodsAmount(state){
      return state.cart.filter(item=>item.goods_state)//将需要购买的商品组成一个新数组
                        .reduce((total,item)=>total+=item.goods_count*item.goods_price,0)  //做总价的计算
                        .toFixed(2) //暴露两位小数
    }
    
  }
}
